Emberveil sourcegame/2006Scape Server/src/main/java/com/rs2/net/packets/impl/AttackPlayer.java
package com.rs2.net.packets.impl;
import com.rs2.Constants;
import com.rs2.game.content.combat.CombatConstants;
import com.rs2.game.content.combat.magic.CastOnOther;
import com.rs2.game.content.combat.magic.MagicData;
import com.rs2.game.content.combat.range.RangeData;
import com.rs2.game.items.DeprecatedItems;
import com.rs2.game.players.Player;
import com.rs2.game.players.PlayerHandler;
import com.rs2.net.Packet;
import com.rs2.net.packets.PacketType;
public class AttackPlayer implements PacketType {
public static final int ATTACK_PLAYER = 73, MAGE_PLAYER = 249;
@Override
public void processPacket(Player player, Packet packet) {
player.endCurrentTask();
player.playerIndex = 0;
player.npcIndex = 0;
switch (packet.getOpcode()) {
/**
* Attack player
**/
case ATTACK_PLAYER:
player.playerIndex = packet.readSignedWordBigEndian();
if (PlayerHandler.players[player.playerIndex] == null) {
break;
}
if (player.inDuelArena() && !player.duelingArena()) {
player.getChallengePlayer().processPacket(player, null);
}
if (player.respawnTimer > 0) {
break;
}
if (player.autocastId > 0) {
player.autocasting = true;
}
if (!player.autocasting && player.spellId > 0) {
player.spellId = 0;
}
player.mageFollow = false;
player.spellId = 0;
player.usingMagic = false;
boolean usingBow = false;
boolean usingOtherRangeWeapons = false;
boolean usingArrows = false;
boolean usingCross = player.playerEquipment[player.playerWeapon] == 9185;
for (int bowId : RangeData.BOWS) {
if (player.playerEquipment[player.playerWeapon] == bowId) {
usingBow = true;
for (int arrowId : RangeData.ARROWS) {
if (player.playerEquipment[player.playerArrows] == arrowId) {
usingArrows = true;
}
}
}
}
for (int otherRangeId : RangeData.OTHER_RANGE_WEAPONS) {
if (player.playerEquipment[player.playerWeapon] == otherRangeId) {
usingOtherRangeWeapons = true;
}
}
if (player.duelStatus == 5) {
if (player.duelCount > 0) {
player.getPacketSender().sendMessage("The duel hasn't started yet!");
player.playerIndex = 0;
return;
}
if (player.duelRule[9]) {
boolean canUseWeapon = false;
for (int funWeapon : Constants.FUN_WEAPONS) {
if (player.playerEquipment[player.playerWeapon] == funWeapon) {
canUseWeapon = true;
}
}
if (!canUseWeapon) {
return;
}
}
if (player.duelRule[2] && (usingBow || usingOtherRangeWeapons)) {
player.getPacketSender().sendMessage("Range has been disabled for this duel!");
return;
}
if (player.duelRule[3] && !usingBow && !usingOtherRangeWeapons) {
player.getPacketSender().sendMessage("Melee has been disabled for this duel!");
return;
}
}
if ((usingBow || player.autocasting) && player.goodDistance(player.getX(), player.getY(), PlayerHandler.players[player.playerIndex].getX(), PlayerHandler.players[player.playerIndex].getY(), 6)) {
player.usingBow = true;
player.stopMovement();
}
if (usingOtherRangeWeapons && player.goodDistance(player.getX(), player.getY(), PlayerHandler.players[player.playerIndex].getX(), PlayerHandler.players[player.playerIndex].getY(), 3)) {
player.usingRangeWeapon = true;
player.stopMovement();
}
if (!usingBow) {
player.usingBow = false;
}
if (!usingOtherRangeWeapons) {
player.usingRangeWeapon = false;
}
if (!usingCross && !usingArrows && usingBow && player.playerEquipment[player.playerWeapon] < 4212 && player.playerEquipment[player.playerWeapon] > 4223) {
player.getPacketSender().sendMessage("You have run out of arrows!");
return;
}
if (RangeData.correctBowAndArrows(player) < player.playerEquipment[player.playerArrows]
&& CombatConstants.CORRECT_ARROWS
&& usingBow
&& !RangeData.usingCrystalBow(player)
&& player.playerEquipment[player.playerWeapon] != 9185) {
player.getPacketSender().sendMessage("You can't use " + DeprecatedItems.getItemName(player.playerEquipment[player.playerArrows]).toLowerCase() + "s with a " + DeprecatedItems.getItemName(player.playerEquipment[player.playerWeapon]).toLowerCase() + ".");
player.stopMovement();
player.getCombatAssistant().resetPlayerAttack();
return;
}
if (player.playerEquipment[player.playerWeapon] == 9185 && !player.getCombatAssistant().properBolts()) {
player.getPacketSender().sendMessage("You must use bolts with a crossbow.");
player.stopMovement();
player.getCombatAssistant().resetPlayerAttack();
return;
}
if (player.getCombatAssistant().checkReqs()) {
player.followPlayerId = player.playerIndex;
if (!player.usingMagic && !usingBow && !usingOtherRangeWeapons) {
player.followDistance = 1;
player.getPlayerAssistant().followPlayer();
}
}
break;
/**
* Attack player with magic
**/
case MAGE_PLAYER:
if (!player.mageAllowed) {
player.mageAllowed = true;
break;
}
player.playerIndex = packet.readSignedWordA();
int castingSpellId = packet.readSignedWordBigEndian();
player.castingSpellId = castingSpellId;
player.usingMagic = false;
boolean teleother = CastOnOther.castOnOtherSpells(castingSpellId);
if (PlayerHandler.players[player.playerIndex] == null) {
break;
}
if (player.respawnTimer > 0) {
break;
}
if (player.playerRights == 3) {
player.getPacketSender().sendMessage(
"Casting Spell id: " + castingSpellId + ".");
}
if (teleother) {
if (player.inTrade) {
player.getTrading().declineTrade(true);
}
if (player.inWild()
&& player.wildLevel > Constants.NO_TELEPORT_WILD_LEVEL) {
player.getPacketSender().sendMessage(
"You can't teleport above level "
+ Constants.NO_TELEPORT_WILD_LEVEL
+ " in the wilderness.");
break;
}
if (player.duelStatus == 5) {
player.getPacketSender().sendMessage("You can't do that in a duel.");
player.usingMagic = false;
player.stopMovement();
player.getCombatAssistant().resetPlayerAttack();
return;
}
}
switch (player.castingSpellId) {
case 12425:
CastOnOther.teleOtherDistance(player, 0, player.playerIndex);
break;
case 12435:
CastOnOther.teleOtherDistance(player, 1, player.playerIndex);
break;
case 12455:
CastOnOther.teleOtherDistance(player, 2, player.playerIndex);
break;
}
if (teleother) {
player.stopMovement();
player.getCombatAssistant().resetPlayerAttack();
}
for (int i = 0; i < MagicData.MAGIC_SPELLS.length; i++) {
if (castingSpellId == MagicData.MAGIC_SPELLS[i][0]) {
player.spellId = i;
player.usingMagic = true;
break;
}
}
if (player.autocasting) {
player.autocasting = false;
}
if (!teleother) {
if (!player.getCombatAssistant().checkReqs()) {
break;
}
if (player.duelStatus == 5) {
if (player.duelCount > 0) {
player.getPacketSender().sendMessage(
"The duel hasn't started yet!");
player.playerIndex = 0;
return;
}
if (player.duelRule[4]) {
player.getPacketSender().sendMessage(
"Magic has been disabled in this duel!");
return;
}
if (MagicData.MAGIC_SPELLS[player.spellId][0] == 12445)
{
player.getPacketSender().sendMessage(
"You can't do that in a duel.");
player.usingMagic = false;
player.stopMovement();
player.getCombatAssistant().resetPlayerAttack();
return;
}
}
for (int r = 0; r < player.REDUCE_SPELLS.length; r++) { // reducing
// spells,
// confuse
// etc
if (PlayerHandler.players[player.playerIndex].REDUCE_SPELLS[r] == MagicData.MAGIC_SPELLS[player.spellId][0]) {
if (System.currentTimeMillis()
- PlayerHandler.players[player.playerIndex].reduceSpellDelay[r] < PlayerHandler.players[player.playerIndex].REDUCE_SPELL_TIME[r]) {
player.getPacketSender()
.sendMessage(
"That player is currently immune to this spell.");
player.usingMagic = false;
player.stopMovement();
player.getCombatAssistant().resetPlayerAttack();
}
break;
}
}
if (System.currentTimeMillis()
- PlayerHandler.players[player.playerIndex].teleBlockDelay < PlayerHandler.players[player.playerIndex].teleBlockLength
&& MagicData.MAGIC_SPELLS[player.spellId][0] == 12445) {
player.getPacketSender().sendMessage(
"That player is already affected by this spell.");
player.usingMagic = false;
player.stopMovement();
player.getCombatAssistant().resetPlayerAttack();
}
}
break;
}
}
}